home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 11 - 1995 / 11.02 Feb 95 / 11.02 Getting Started / ListTester / LinkedList.cp < prev    next >
Encoding:
Text File  |  1994-11-30  |  3.3 KB  |  165 lines  |  [TEXT/MMCC]

  1. /*
  2.     File:        LinkedList.cp
  3.  
  4.     Contains:    A linked list
  5.     Written by: Dave Mark
  6.     Copyright:    © 1994 by Dave Mark, all rights reserved.
  7.  */
  8.  
  9. #include "LinkedList.h"
  10. #include "Link.h"
  11.  
  12.  
  13. TLinkedList::TLinkedList()
  14. {
  15.     fFirstLinkPtr = nil;
  16.     fLastLinkPtr = nil;
  17. }
  18.  
  19.  
  20. TLinkedList::~TLinkedList()
  21. {
  22.     DeleteAllLinks();
  23. }
  24.  
  25.  
  26. OSErr TLinkedList::CreateAndAddLink( void *objectPtr )
  27. {
  28.     TLink    *newLinkPtr;
  29.     
  30.     newLinkPtr = new TLink( objectPtr );
  31.     
  32.     if ( newLinkPtr == nil )
  33.         return kLink_BadLinkErr;
  34.  
  35.     if ( fFirstLinkPtr == nil )
  36.         fFirstLinkPtr = newLinkPtr;
  37.     
  38.     if ( fLastLinkPtr != nil )
  39.         fLastLinkPtr->SetNextLink( newLinkPtr );
  40.  
  41.     newLinkPtr->SetPrevLink( fLastLinkPtr );
  42.     newLinkPtr->SetNextLink( nil );
  43.     
  44.     fLastLinkPtr = newLinkPtr;
  45.     
  46.     return noErr;
  47. }
  48.  
  49.  
  50. OSErr TLinkedList::FindAndDeleteLink( void *objectPtr )
  51. {
  52.     TLink        *foundLinkPtr;
  53.     
  54.     foundLinkPtr = FindLink( objectPtr );
  55.     
  56.     if ( foundLinkPtr == nil )
  57.         return kLinkedList_LinkNotFoundErr;
  58.     else
  59.         return DeleteLink( foundLinkPtr );
  60. }
  61.  
  62.  
  63. unsigned long TLinkedList::CountLinks()
  64. {
  65.     TLink            *currentLinkPtr;
  66.     unsigned long    numLinks;
  67.     
  68.     numLinks = 0;
  69.     currentLinkPtr = fFirstLinkPtr;
  70.     
  71.     while ( currentLinkPtr != nil )
  72.     {
  73.         numLinks++;
  74.         currentLinkPtr = currentLinkPtr->GetNextLink();
  75.     }
  76.     
  77.     return numLinks;
  78. }
  79.  
  80.  
  81. void    *TLinkedList::GetNthLinkObject( unsigned long linkIndex )
  82. {
  83.     TLink            *currentLinkPtr;
  84.     unsigned long    numLinks, curLinkIndex;
  85.     
  86.     numLinks = CountLinks();
  87.     
  88.     if ( (linkIndex < 1) || (linkIndex > numLinks) )
  89.         return nil;
  90.     
  91.     curLinkIndex = 0;
  92.     currentLinkPtr = fFirstLinkPtr;
  93.     
  94.     for ( curLinkIndex=1; curLinkIndex<linkIndex; curLinkIndex++ )
  95.         currentLinkPtr = currentLinkPtr->GetNextLink();
  96.         
  97.     return currentLinkPtr->GetObjectPtr();
  98. }
  99.  
  100.  
  101. void TLinkedList::DeleteAllLinks() //Avoids overhead of repeated delete/repair list cycle...
  102. {
  103.     TLink        *currentLinkPtr, *nextLinkPtr;
  104.     
  105.     currentLinkPtr = fFirstLinkPtr;
  106.     
  107.     while ( currentLinkPtr != nil )
  108.     {
  109.         nextLinkPtr = currentLinkPtr->GetNextLink();
  110.         
  111.         delete currentLinkPtr;
  112.         
  113.         currentLinkPtr = nextLinkPtr;
  114.     }
  115.     
  116.     fFirstLinkPtr = nil;
  117.     fLastLinkPtr = nil;
  118. }
  119.  
  120.  
  121. TLink    *TLinkedList::FindLink( void *objectPtr )
  122. {
  123.     TLink        *currentLinkPtr;
  124.     
  125.     currentLinkPtr = fFirstLinkPtr;
  126.     
  127.     while ( currentLinkPtr != nil )
  128.     {
  129.         if ( currentLinkPtr->GetObjectPtr() == objectPtr )
  130.             return currentLinkPtr;
  131.             
  132.         currentLinkPtr = currentLinkPtr->GetNextLink();
  133.     }
  134.     return nil;
  135. }
  136.  
  137.  
  138. OSErr    TLinkedList::DeleteLink( TLink *linkPtr )
  139. {
  140. //    SPECIAL CASE: Tried to delete nil TLink...
  141.     if ( linkPtr == nil )
  142.         return kLinkedList_CouldNotDeleteLinkErr;
  143.     
  144. //    SPECIAL CASE: Tried to delete first TLink on list...
  145. //                That means the fFirstLinkPtr needs to be fixed...
  146.     if ( linkPtr == fFirstLinkPtr )
  147.         fFirstLinkPtr = linkPtr->GetNextLink();
  148. //    SPECIAL CASE: Tried to delete a link that wasn't first in the list...
  149. //                That means that we need to set the previous link's
  150. //                "next" pointer to point to the link after us...
  151.     else
  152.         linkPtr->GetPrevLink()->SetNextLink( linkPtr->GetNextLink() );
  153.  
  154. //    SPECIAL CASE: Tried to delete last TLink on list...
  155. //                That means the fLastLinkPtr needs to be fixed...
  156.     if ( linkPtr == fLastLinkPtr )
  157.         fLastLinkPtr = linkPtr->GetPrevLink();
  158. //    SPECIAL CASE: Tried to delete a link that wasn't last in the list...
  159. //                That means that we need to set the next link's
  160. //                "prev" pointer to point to the link before us...
  161.     else
  162.         linkPtr->GetNextLink()->SetPrevLink( linkPtr->GetPrevLink() );
  163.     
  164.     return noErr;
  165. }